Перейти к основному содержимому

Условные конструкции

Что такое условные конструкции

Условные конструкции позволяют программе выполнять разный код в зависимости от условий.

int age = 17;

if (age >= 18) {
printf("Совершеннолетний\n");
} else {
printf("Несовершеннолетний\n");
}

Конструкция if

Самая простая форма условного выполнения.

Базовый синтаксис

#include <stdio.h>

int main() {
int temperature = 25;

if (temperature > 30) {
printf("Жарко! Включаем кондиционер\n");
}

if (temperature < 10) {
printf("Холодно! Включаем отопление\n");
}

if (temperature >= 18 && temperature <= 25) {
printf("Комфортная температура\n");
}

return 0;
}

Блоки кода

int score = 95;

// Без фигурных скобок - только одна инструкция
if (score >= 90)
printf("Отличная работа!\n");

// Лучше всегда использовать скобки для ясности
if (score >= 90) {
printf("Отличная работа!\n");
}

Конструкция if-else

Выполняет один блок кода, если условие истинно, и другой — если ложно.

#include <stdio.h>

int main() {
int password = 1234;
int userInput = 1234;

if (userInput == password) {
printf("✓ Пароль верный\n");
printf("Добро пожаловать в систему!\n");
} else {
printf("✗ Неверный пароль\n");
printf("Доступ запрещен\n");
}

return 0;
}

Множественные условия (if-else if-else)

Проверка нескольких условий по порядку.

Система оценок

#include <stdio.h>

int main() {
int points = 87;

printf("Набрано баллов: %d\n", points);
printf("Оценка: ");

if (points >= 90) {
printf("Отлично (A)\n");
} else if (points >= 80) {
printf("Хорошо (B)\n");
} else if (points >= 70) {
printf("Удовлетворительно (C)\n");
} else if (points >= 60) {
printf("Зачет (D)\n");
} else {
printf("Незачет (F)\n");
}

return 0;
}

Определение времени года

#include <stdio.h>

int main() {
int month = 7; // Июль

if (month == 12 || month == 1 || month == 2) {
printf("Зима\n");
} else if (month >= 3 && month <= 5) {
printf("Весна\n");
} else if (month >= 6 && month <= 8) {
printf("Лето\n");
} else if (month >= 9 && month <= 11) {
printf("Осень\n");
} else {
printf("Неверный номер месяца\n");
}

return 0;
}

Конструкция switch

Эффективная замена длинной цепочки if-else для проверки одной переменной на разные значения.

Базовый switch

#include <stdio.h>

int main() {
int dayNumber = 3;

printf("День недели #%d: ", dayNumber);

switch (dayNumber) {
case 1:
printf("Понедельник\n");
break;
case 2:
printf("Вторник\n");
break;
case 3:
printf("Среда\n");
break;
case 4:
printf("Четверг\n");
break;
case 5:
printf("Пятница\n");
break;
case 6:
printf("Суббота\n");
break;
case 7:
printf("Воскресенье\n");
break;
default:
printf("Неверный номер дня\n");
break;
}

return 0;
}

Группировка случаев

#include <stdio.h>

int main() {
char grade = 'B';

printf("Оценка %c: ", grade);

switch (grade) {
case 'A':
case 'a':
printf("Отлично! Поздравляем!\n");
break;
case 'B':
case 'b':
printf("Хорошо! Продолжайте в том же духе\n");
break;
case 'C':
case 'c':
printf("Удовлетворительно\n");
break;
case 'D':
case 'd':
case 'F':
case 'f':
printf("Нужно подтянуть знания\n");
break;
default:
printf("Неизвестная оценка\n");
}

return 0;
}

Вложенные условия

Условия внутри других условий для сложной логики.

#include <stdio.h>

int main() {
int age = 25;
int hasLicense = 1;
int hasInsurance = 0;

printf("Проверка права вождения:\n");

if (age >= 18) {
printf("✓ Возраст подходит\n");

if (hasLicense) {
printf("✓ Права есть\n");

if (hasInsurance) {
printf("✓ Страховка оформлена\n");
printf("Результат: Можно садиться за руль!\n");
} else {
printf("✗ Нет страховки\n");
printf("Результат: Нужно оформить страховку\n");
}
} else {
printf("✗ Нет водительских прав\n");
printf("Результат: Нужно получить права\n");
}
} else {
printf("✗ Слишком молод\n");
printf("Результат: Подождите до 18 лет\n");
}

return 0;
}

Тернарный оператор

Сокращенная форма if-else для простых случаев.

Синтаксис

условие ? значение_если_истина : значение_если_ложь

Примеры использования

#include <stdio.h>

int main() {
int age = 16;

// Обычный if-else
if (age >= 18) {
printf("Статус: Взрослый\n");
} else {
printf("Статус: Несовершеннолетний\n");
}

// Тернарный оператор
printf("Статус: %s\n", age >= 18 ? "Взрослый" : "Несовершеннолетний");

return 0;
}

Практические примеры

Система входа в систему

#include <stdio.h>

int main() {
char username[] = "admin";
char password[] = "12345";

char inputUser[] = "admin";
char inputPass[] = "12345";

int userMatch = 1; // Упрощено для примера
int passMatch = 1; // В реальности используйте strcmp()

if (userMatch && passMatch) {
printf("🟢 Вход выполнен успешно\n");
printf("Добро пожаловать, %s!\n", username);
} else {
printf("🔴 Ошибка входа\n");

if (!userMatch) {
printf("Неверное имя пользователя\n");
}

if (!passMatch) {
printf("Неверный пароль\n");
}
}

return 0;
}

Банковские операции

#include <stdio.h>

int main() {
float balance = 1500.50;
float withdrawal = 800.00;
int accountType = 2; // 1 = обычный, 2 = премиум

printf("Баланс: %.2f руб.\n", balance);
printf("Запрос на снятие: %.2f руб.\n", withdrawal);

// Проверка лимитов в зависимости от типа счета
float dailyLimit;
if (accountType == 1) {
dailyLimit = 1000.00;
printf("Тип счета: Обычный\n");
} else if (accountType == 2) {
dailyLimit = 5000.00;
printf("Тип счета: Премиум\n");
} else {
dailyLimit = 500.00;
printf("Тип счета: Базовый\n");
}

printf("Дневной лимит: %.2f руб.\n", dailyLimit);

// Проверка возможности операции
if (withdrawal > balance) {
printf("❌ Недостаточно средств на счете\n");
} else if (withdrawal > dailyLimit) {
printf("❌ Превышен дневной лимит\n");
} else {
balance -= withdrawal;
printf("✅ Операция выполнена успешно\n");
printf("Новый баланс: %.2f руб.\n", balance);
}

return 0;
}

Конструкция switch-case

Эффективная альтернатива для множественного выбора.

Меню программы

#include <stdio.h>

int main() {
int choice = 2;

printf("=== ГЛАВНОЕ МЕНЮ ===\n");
printf("1. Новая игра\n");
printf("2. Загрузить игру\n");
printf("3. Настройки\n");
printf("4. Выход\n");
printf("Ваш выбор: %d\n\n", choice);

switch (choice) {
case 1:
printf("🎮 Запуск новой игры...\n");
printf("Создание персонажа\n");
break;

case 2:
printf("💾 Загрузка сохраненной игры...\n");
printf("Найдено 3 сохранения\n");
break;

case 3:
printf("⚙️ Открытие настроек...\n");
printf("Графика | Звук | Управление\n");
break;

case 4:
printf("👋 Выход из игры\n");
printf("До свидания!\n");
break;

default:
printf("❌ Неверный выбор\n");
printf("Выберите пункт от 1 до 4\n");
}

return 0;
}

Обработка символьных команд

#include <stdio.h>

int main() {
char command = 'S';
int gameRunning = 1;

printf("Команда: %c\n", command);

switch (command) {
case 'W':
case 'w':
printf("⬆️ Движение вперед\n");
break;

case 'S':
case 's':
printf("⬇️ Движение назад\n");
break;

case 'A':
case 'a':
printf("⬅️ Движение влево\n");
break;

case 'D':
case 'd':
printf("➡️ Движение вправо\n");
break;

case 'Q':
case 'q':
printf("🚪 Выход из игры\n");
gameRunning = 0;
break;

default:
printf("❓ Неизвестная команда\n");
}

printf("Игра активна: %s\n", gameRunning ? "Да" : "Нет");

return 0;
}

Логические условия

Сложные проверки

#include <stdio.h>

int main() {
int hour = 14;
int isWeekend = 0;
int isHoliday = 0;

// Определяем режим работы
if ((hour >= 9 && hour < 18) && !isWeekend && !isHoliday) {
printf("🏢 Офис открыт\n");
printf("Рабочее время: 9:00 - 18:00\n");
} else if (isWeekend) {
printf("🏠 Выходной день\n");
printf("Офис закрыт\n");
} else if (isHoliday) {
printf("🎉 Праздничный день\n");
printf("Офис закрыт\n");
} else {
printf("🌙 Нерабочее время\n");
printf("Офис закрыт до 9:00\n");
}

return 0;
}

Проверка диапазонов

#include <stdio.h>

int main() {
int speed = 75; // км/ч
int speedLimit = 60;

printf("Скорость: %d км/ч\n", speed);
printf("Ограничение: %d км/ч\n", speedLimit);

if (speed <= speedLimit) {
printf("✅ Скорость в норме\n");
} else if (speed <= speedLimit + 20) {
printf("⚠️ Превышение скорости\n");
printf("Штраф: 500 рублей\n");
} else if (speed <= speedLimit + 40) {
printf("🚨 Серьезное превышение\n");
printf("Штраф: 1500 рублей\n");
} else {
printf("🚔 Критическое превышение\n");
printf("Лишение прав на 6 месяцев\n");
}

return 0;
}

Частые ошибки

Типичные проблемы
// ❌ Забыть break в switch
switch (grade) {
case 'A':
printf("Отлично\n");
// Забыли break! Выполнится и следующий case
case 'B':
printf("Хорошо\n");
break;
}

// ❌ Путаница = и ==
if (x = 5) { // Присваивание вместо сравнения!

// ❌ Неправильная проверка диапазона
if (10 < x < 20) { // Не работает как ожидается
// Правильно:
if (x > 10 && x < 20) {

// ❌ Отсутствие фигурных скобок
if (condition)
printf("Первая строка\n");
printf("Вторая строка\n"); // Выполнится всегда!
Важные моменты
  • В switch можно использовать только целочисленные типы и символы
  • Всегда добавляйте break в конце каждого case
  • Используйте default для обработки неожиданных значений
  • Фигурные скобки делают код понятнее, даже если не обязательны

Лучшие практики

Советы по стилю
// ✅ Хороший стиль
if (age >= 18) {
printf("Совершеннолетний\n");
} else {
printf("Несовершеннолетний\n");
}

// ✅ Проверка на валидность сначала
if (denominator == 0) {
printf("Ошибка: деление на ноль\n");
} else {
float result = numerator / denominator;
printf("Результат: %.2f\n", result);
}

// ✅ Используйте константы вместо магических чисел
const int ADULT_AGE = 18;
if (age >= ADULT_AGE) {
// понятнее чем if (age >= 18)
}

Условные конструкции — основа логики программ, позволяющая создавать интерактивные и адаптивные приложения.